package itheima.com.testlistfragmentdemo.net;

import com.loopj.android.http.AsyncHttpResponseHandler;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import itheima.com.testlistfragmentdemo.utils.StreamUtil;

import static android.R.attr.data;

/**
 * Created by Administrator on 2017/7/13 0013.
 * 网络请求的工具类
 */
public class OSChinaAPI {
    /**
     * 访问网络，获取数据，开子线程 ,通过HttpUrlConnection 实现网络访问
     * @param urlStr
     * @param resultListener
     */
    public static void getData(final String urlStr, final ResultListener resultListener) {
        new Thread(){
            @Override
            public void run() {
                try {
                    URL url=new URL(urlStr);
                   HttpURLConnection conn= (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    int responseCode = conn.getResponseCode();
                    if(responseCode==HttpURLConnection.HTTP_OK){
                        //访问网络成功
                        InputStream is = conn.getInputStream();
                       //把流转化为字节数组
                        byte[] datas = StreamUtil.streamConvertBytes(is);

                        //调用回调接口对象的成功方法
                        resultListener.onSuccess(datas);
//

                    }else{
                        //访问网络失败
                        resultListener.onFailure("访问网络失败");
                    }
                } catch (Exception e) {
                    //访问网络异常
                    resultListener.onFailure("访问网络异常");
                    e.printStackTrace();
                }

            }
        }.start();
    }

    /**
     * 通过第三方的网络框架 访问网络
     * 1. 每一次请求都会构建一个网络访问框架 的对象  ，太耗内存
     * ？ 能不能用一个单一的对象来统一访问网络
     *    解决方式： 在Application中 构建一个单一的 网络请求框架 对象,再把对象传递出去
     * <p>
     * 2. 假如每次访问网络的请求头都是相同的，那每次设置请求头，太麻烦
     * ？ 能不能对单一的 网络请求对象，进行再一次封装 ，把请求头信息一次设置好
     *
     *
     * 3. 请求地址 不够灵活 ，希望依据不同的界面业务需求，封装请求
     *   比如： url ：http://10.0.2.2:8080/oschina/list/news/page1.xml
     *       改成： getNewsList()方法
     *
     */

    public static void getData(final String urlPath, final AsyncHttpResponseHandler listener) {
        //构建一个异步Http客户端 对象
/*        AsyncHttpClient asyncHttpClient = new AsyncHttpClient();
        RequestParams requestParams = new RequestParams();
        requestParams.put("account","android");
        requestParams.put("pwd","1234");

        //设置头部信息
        asyncHttpClient.addHeader("Accept-Language", "zh_CN");
        asyncHttpClient.addHeader("Connection", "Keep-Alive");*/

        //通过AsyncHttpClient的代理类来访问网络

//        asyncHttpClient.get(urlPath, null, listener);

        // ApiHttpClient是 AsyncHttpClient对象的代理类 ，采用代理设计模式
        ApiHttpClient.getData(urlPath,listener);
    }

    //取得资讯列表的数据
    public static void getNewsList(int pagerIndex, AsyncHttpResponseHandler listener) {
        //realUrl="http://10.0.3.2:8080/oschina/list/news/page0.xml";
        String partUrl="/oschina/list/news/page"+pagerIndex+".xml";
        ApiHttpClient.getData(partUrl,listener);
    }
    //取得博客列表的数据
    public static void getBlogList(int pagerIndex, AsyncHttpResponseHandler listerner) {
        String partUrl="/oschina/list/blog/page"+pagerIndex+".xml";
        ApiHttpClient.getData(partUrl,listerner);
    }

    //定义一个访问网络的回调接口
    public  interface  ResultListener{
        void onSuccess(byte[] datas);
        void onFailure(String errorInfo);
    }
}
